package thread;

import java.util.ArrayList;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * Created with IntelliJ IDEA
 * Description：核心操作为 submit, 将任务加入线程池中
 *              使用 Worker 类描述一个工作线程. 使用 Runnable 描述一个任务.
 *              使用一个 BlockingQueue 组织所有的任务
 *              每个 worker 线程要做的事情: 不停的从 BlockingQueue 中取任务并执行.
 *              指定一下线程池中的最大线程数 maxWorkerCount; 当当前线程数超过这个最大值时, 就不再新增线程了.
 * User：chenshu
 * Date：2023-11-10
 * Time：11:23
 */
class MyThreadPool {
    //最大线程数
    int maxWorkerCount = 20;
    //使用一个队列来存放任务
    BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();
    //使用一个顺序表存放线程,便于管理线程：如中断操作等
    ArrayList<Thread> workers= new ArrayList<>();

    //线程池被创建的时候就开始创建线程
    public MyThreadPool(int amount) {
        amount = Math.min(amount, maxWorkerCount);
        for (int i = 0; i < amount; i++) {
            //每个线程都尝试从列表中取出任务并执行
            Thread t = new Thread(() -> {
                while (!Thread.currentThread().isInterrupted()) {
                    try {
                        Runnable task = queue.take();
                        task.run();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            });
            workers.add(t);
            t.start();
        }
    }

    //将任务放入任务列表中
    public void submit(Runnable task) {
        try {
            queue.put(task);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

public class Demo3 {
    public static void main(String[] args) {
        MyThreadPool myThreadPool = new MyThreadPool(10);
        for (int i = 0; i < 100; i++) {
            myThreadPool.submit(new Runnable(){
                @Override
                public void run() {
                    System.out.println("hello thread");
                }
            });
        }
    }
}
